#include"common.h"
#include<iostream>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<cerrno>
#include<cstring>
#include<unistd.h>
#include<cstdio>

#define SIZE 100
#define STYLE '#'
#define SLEEP_TIME 50*1000  //50毫秒

#define MAX_DATA 1024*1024
#define DOWN_SPEED 1024*10

using namespace std;

bool MakeFifo()
{
    //1.创建命名管道
    int ret=mkfifo(filename,0666);
    if(ret<0)
    {
        cout<<"error:"<<errno<<",strerror:"<<strerror(errno)<<endl;
        return false;
    }
    cout<<"命名管道文件创建成功..."<<endl;

    return true;
}

bool DelFifo()
{
    //1.创建命名管道
    int ret=unlink(filename);
    if(ret<0)
    {
        cout<<"error:"<<errno<<",strerror:"<<strerror(errno)<<endl;
        return false;
    }
    cout<<"命名管道文件删除成功..."<<endl;

    return true;
}

void Progress_bar_Loading()
{
    int rate=0;
    char bar[SIZE+1];
   //char bar[SIZE+1]={0};//多出来的那个给'\0'
   memset(bar,'\0',sizeof(bar));//数组初始化

   char arr[4]={'|','/','-','\\'};
  // printf("%s",arr);
  // int len =strlen(arr);
   // printf("%d\n",strlen(arr));  它的长度居然是6
   while(rate<=100)
   {
       printf("[%-100s][%d%%][%c]\r",bar,rate,arr[rate%4]);//'\r'表示回车   '\n'表示回车+换行  换行可以刷新缓冲区
       fflush(stdout);

       usleep(SLEEP_TIME);

       bar[rate++]=STYLE;
   }
    printf("\n");
}

int main()
{
    //2.服务端以写的方式打开管道文件
    cout<<"服务端以写的方式打开管道文件中..."<<endl;
start:
    int wfd=open(filename,O_WRONLY);
    if(wfd<0){
        cout<<"error:"<<errno<<",strerror:"<<strerror(errno)<<endl;
        if(MakeFifo())goto start;
        else return 1;
    }
    else 
        cout<<"命名管道文件已存在，正在为您打开..."<<endl;

    //cout<<"----------------------------------------------------"<<endl;//可以换成进度条实现的代码
    Progress_bar_Loading();

    cout<<"服务端打开文件成功!"<<endl;
    usleep(1000*500);//0.5秒

    string messege;
    //char buffer[MAX];
     while(1)
     {
        cout<<"服务人员请输入数据:"<<endl;
        //dup2(wfd,0);
        //getc(stdin);
        //gets(buffer);
        getline(cin,messege);
        //char c=getc(stdin);
        write(wfd,messege.c_str(),messege.size());
        //write(wfd,&c,1);
    }

    close(wfd);
    return 0;
}